﻿using DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Descripción breve de ModContabilidad
/// </summary>
public class ModContabilidad
{
    private lqDataContext data;
	public ModContabilidad()
	{
        data = new lqDataContext();
	}
    private String generadorCodigo(Tbl_ActivoFijos af){
        var checktipo = from at in data.Tbl_TiposActivosFijos
                        where at.iTipoActivo_id == af.iTipoActivo_id
                        select at;
        String cod = checktipo.ToList().ElementAt(0).sCodigoActivoFijo;
        var checkactivo = from per in data.Tbl_ActivoFijos
                           where per.iTipoActivo_id == af.iTipoActivo_id
                           select per;
        int x = checkactivo.ToList().Count();
        x = x + 1;
        if (x < 10)
        {
            cod = cod + "0000" + x;
        }
        else if (x < 100)
        {
            cod = cod + "000" + x;
        }
        else if (x < 1000)
        {
            cod = cod + "00" + x;
        }
        else if (x < 10000)
        {
            cod = cod + "0" + x;
        }
        else
        {
            cod = cod + x;
        }
        return cod;
    }
    public void insertActivoFijo(Tbl_ActivoFijos af, int cant) 
    {
        for (int i = 0; i < cant; i++)
        {
            Tbl_ActivoFijos nuevo = new Tbl_ActivoFijos();
            nuevo.iTipoActivo_id = af.iTipoActivo_id;
            nuevo.iConcurrencia = 1;
            nuevo.iCreadoPor = af.iCreadoPor;
            nuevo.iValorOriginalCompra = af.iValorOriginalCompra;
            nuevo.iValorActualizado = af.iValorOriginalCompra;
            nuevo.iValorNeto = af.iValorOriginalCompra;
            nuevo.sLocalizacionActual = af.sLocalizacionActual;
            nuevo.sDescripcionActivo = af.sDescripcionActivo;
            nuevo.iUltimaDepreciacion = 0;
            nuevo.iDepreciacionAcumulada = 0;
            nuevo.Encargado = af.Encargado;
            nuevo.iModificadoPor = af.iCreadoPor;
            nuevo.dtFecha_ingreso = af.dtFecha_ingreso;
            nuevo.dtFecha_UltimaDepreciacion = af.dtFecha_UltimaDepreciacion;
            nuevo.iEstado_fl = true;
            nuevo.iEstadoActivo_fl = true;
            nuevo.sCodigoActivoFijo = this.generadorCodigo(af);
            data.Tbl_ActivoFijos.InsertOnSubmit(nuevo);
            try
            {
                data.SubmitChanges();
                Console.WriteLine("inserto!!!");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                data.SubmitChanges();
            }
        }
     
    }
    public bool delActivoFijo(Tbl_ActivoFijos af)
    {
        try
        {
            Tbl_ActivoFijos update = data.Tbl_ActivoFijos.Single(x => x.iActivoFijo_id == af.iActivoFijo_id);
            if (update.iDepreciacionAcumulada != 0) {
                return false;
            }
            var checkdepre = from per in data.Tbl_HistorialDepreciacion
                             where per.iEstado_fl == true && per.iActivoFijo_id == af.iActivoFijo_id
                             select per;
            
            if (update.iConcurrencia == af.iConcurrencia)
            {
               
                update.iConcurrencia = af.iConcurrencia+1;
                update.iModificadoPor = af.iModificadoPor;
                update.iEstado_fl =false;
                if (checkdepre.ToList().Count() > 0)
                {
                    for (int i = 0; i < checkdepre.ToList().Count(); i++)
                    {
                        this.delHistorialDeprec(checkdepre.ToList().ElementAt(i));
                    }
                }
                data.SubmitChanges();
                return true;
            }
            else
            {
                return false;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            data.SubmitChanges();
        }
        return false;

    }
    public bool updateActivo(Tbl_ActivoFijos af)
    {
        try
        {
            Tbl_ActivoFijos update = data.Tbl_ActivoFijos.Single(x => x.iActivoFijo_id == af.iActivoFijo_id);
            if (update.iConcurrencia == af.iConcurrencia)
            {
                update.iTipoActivo_id = af.iTipoActivo_id;
                update.iConcurrencia = af.iConcurrencia+1;
                update.iValorActualizado = af.iValorActualizado;
                update.iValorNeto = af.iValorNeto;
                update.sLocalizacionActual = af.sLocalizacionActual;
                update.sDescripcionActivo = af.sDescripcionActivo;
                update.iUltimaDepreciacion = af.iUltimaDepreciacion;
                update.iDepreciacionAcumulada = af.iDepreciacionAcumulada;
                update.Encargado = af.Encargado;
                update.iModificadoPor = af.iModificadoPor;
                update.iEstadoActivo_fl = af.iEstadoActivo_fl;
                update.dtFecha_UltimaDepreciacion = af.dtFecha_UltimaDepreciacion;
                data.SubmitChanges();
                return true;
            }
            else
            {
                return false;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            data.SubmitChanges();
        }
        return false;
    }
    public void moverActivo(int encargado_id, int autorizado_id, String localizacion_nueva,int user_id, Tbl_ActivoFijos activo)
    {

        try
        {
            Tbl_HistorialMovimiento movido = new Tbl_HistorialMovimiento();
            movido.iActivoFijo_id = activo.iActivoFijo_id;
            movido.iConcurrencia = 1;
            movido.iEstado_fl = true;
            movido.AutorizadoPor = autorizado_id;
            movido.CreadoPor = user_id;
            movido.iEncargadoAnterior = activo.Encargado;
            movido.iEncargadoNuevo = encargado_id;
            movido.sLocalizacionAnterior = activo.sLocalizacionActual;
            movido.sLocalizacionNueva = localizacion_nueva;
            data.Tbl_HistorialMovimiento.InsertOnSubmit(movido);

            Tbl_ActivoFijos activoActual = data.Tbl_ActivoFijos.Single(x => x.iActivoFijo_id == activo.iActivoFijo_id);
            activoActual.sLocalizacionActual = localizacion_nueva;
            activoActual.Encargado = encargado_id;
            activoActual.iModificadoPor = user_id;
            activoActual.iConcurrencia = activo.iConcurrencia + 1;

            data.SubmitChanges();
            Console.WriteLine("inserto!!!");
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            data.SubmitChanges();
        }
    }
    public List<Tbl_HistorialMovimiento> getMovimientobyActivo(int activo_id)
    {
        var movimiento = from per in data.Tbl_HistorialMovimiento
                         where per.iEstado_fl == true && per.iActivoFijo_id == activo_id
                         select per;
        return movimiento.ToList();
    }
    public Tbl_ActivoFijos getUltimoActivo()
    {
        var af = from per in data.Tbl_ActivoFijos
                         where per.iEstado_fl == true
                         orderby per.iActivoFijo_id descending
                         select per;
        return af.ToList().ElementAt(0);
    }

    public void insertMejora(Tbl_Mejoras x)
    {
        data.Tbl_Mejoras.InsertOnSubmit(x);
        try
        {
            data.SubmitChanges();
            Console.WriteLine("inserto!!!");
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            data.SubmitChanges();
        }
    }
    public void darBajaActivo(Tbl_ActivoFijos af, String fecha, String motivo, int user_id)
    {
        DateTime date = Convert.ToDateTime(fecha);
        Tbl_ActivosdeBaja baja = new Tbl_ActivosdeBaja();
        baja.iEstado_fl = true;
        baja.iConcurrencia = 1;
        baja.iActivoFijo_id = af.iActivoFijo_id;
        baja.iUsuario_id = user_id;
        baja.sMotivoBaja = motivo;
        baja.dtFecha = date;
        data.Tbl_ActivosdeBaja.InsertOnSubmit(baja);
        Tbl_ActivoFijos activoActual = data.Tbl_ActivoFijos.Single(x => x.iActivoFijo_id == af.iActivoFijo_id);
        activoActual.iModificadoPor = user_id;
        activoActual.iEstadoActivo_fl = false;
        //depreciar activo hasta la fecha de baja
        try
        {
            data.SubmitChanges();
            Console.WriteLine("inserto!!!");
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            data.SubmitChanges();
        }

    }
    public List<Tbl_ActivoFijos> getAllmejorasActivo(int activo_id)
    {
        var subquery = from aux in data.Tbl_Mejoras
                       where aux.iEstado_fl == true && aux.iActivoMejorado == activo_id
                       select aux.iActivoDeMejora;
        List<int> asd = subquery.ToList();
        var mejoras = from lg in data.Tbl_ActivoFijos
                   where lg.iEstado_fl == true && subquery.Contains(lg.iActivoFijo_id)
                   select lg;
        return mejoras.ToList();
    }

    public List<Tbl_TiposActivosFijos> getAllTiposActivo()
    {
        var tipos = from lg in data.Tbl_TiposActivosFijos
                      where lg.iEstado_fl == true
                      select lg;
        return tipos.ToList();
    }
    //filtros
    public List<Tbl_ActivoFijos> getActivoPorFecha(String fecha)
    {
        DateTime date = Convert.ToDateTime(fecha);
        var activo = from lg in data.Tbl_ActivoFijos
                      where lg.iEstado_fl == true && lg.iEstadoActivo_fl ==true && lg.dtFecha_ingreso.Month==date.Month && lg.dtFecha_ingreso.Year == date.Year
                      select lg;
        return activo.ToList();
    }
    public List<Tbl_ActivoFijos> FiltroActivo(String descripcion)
    {
        var activo = from lg in data.Tbl_ActivoFijos
                     where lg.iEstado_fl == true && lg.iEstadoActivo_fl == true && lg.sDescripcionActivo.Contains(descripcion)
                     select lg;
        return activo.ToList();
    }
    public List<Tbl_ActivoFijos> FiltroActivo(int rubro)
    {
        var activo = from lg in data.Tbl_ActivoFijos
                     where lg.iTipoActivo_id==rubro && lg.iEstado_fl == true && lg.iEstadoActivo_fl == true
                     select lg;
        return activo.ToList();
    }
    public List<Tbl_ActivoFijos> FiltroActivo(String fecha, int rubro)
    {
        DateTime date = Convert.ToDateTime(fecha);
        var activo = from lg in data.Tbl_ActivoFijos
                     where lg.iEstado_fl == true && lg.iEstadoActivo_fl == true && lg.iTipoActivo_id == rubro && lg.dtFecha_ingreso.Month == date.Month && lg.dtFecha_ingreso.Year == date.Year
                     select lg;
        return activo.ToList();
    }
    /*public List<Tbl_ActivoFijos> FiltroActivo2(String descripcion, int rubro)
    {
        var activo = from lg in data.Tbl_ActivoFijos
                     where lg.iEstado_fl == true && lg.iEstadoActivo_fl == true && lg.iTipoActivo_id == rubro && lg.sDescripcionActivo.Contains(descripcion)
                     select lg;
        return activo.ToList();
    }*/
    public List<Tbl_ActivoFijos> FiltroActivo(String descripcion, String fecha, int rubro)
    {
        DateTime date = Convert.ToDateTime(fecha);
        var activo = from lg in data.Tbl_ActivoFijos
                     where lg.iEstado_fl == true && lg.iEstadoActivo_fl == true && lg.dtFecha_ingreso.Month == date.Month && lg.dtFecha_ingreso.Year == date.Year && lg.sDescripcionActivo.Contains(descripcion) && lg.iTipoActivo_id==rubro
                     select lg;
        return activo.ToList();
    }
    public List<Tbl_ActivoFijos> FiltroActivo(String descripcion, String fecha)
    {
        DateTime date = Convert.ToDateTime(fecha);
        var activo = from lg in data.Tbl_ActivoFijos
                     where lg.iEstado_fl == true && lg.iEstadoActivo_fl == true && lg.dtFecha_ingreso.Month == date.Month && lg.dtFecha_ingreso.Year == date.Year && lg.sDescripcionActivo.Contains(descripcion)
                     select lg;
        return activo.ToList();
    }
    //fin filtros
    public Tbl_ActivosdeBaja getActivosdebaja(int id)
    {
        var activo = from per in data.Tbl_ActivosdeBaja
                  where per.iEstado_fl == true && per.iActivoFijo_id==id
                  select per;
        return activo.ToList().ElementAt(0);
    }
    public Tbl_ActivoFijos getActivoporID(int id)
    {
        var activo = from per in data.Tbl_ActivoFijos
                     where per.iEstado_fl == true && per.iActivoFijo_id == id
                     select per;
        return activo.ToList().ElementAt(0);
    }
    public void delHistorialDeprec(Tbl_HistorialDepreciacion del)
    {
        try
        {
            Tbl_HistorialDepreciacion update = data.Tbl_HistorialDepreciacion.Single(x => x.iHistorialDepre_id == del.iHistorialDepre_id);
            if (update.iConcurrencia == del.iConcurrencia)
            {
                update.iConcurrencia = update.iConcurrencia + 1;
                update.iEstado_fl = false;
                data.SubmitChanges();
            
            }
            else
            {
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            data.SubmitChanges();
        }
    
    }
    public Tbl_TiposActivosFijos getTipo(int id)
    {
        Tbl_TiposActivosFijos update = data.Tbl_TiposActivosFijos.Single(x => x.iTipoActivo_id == id);
        return update;
    }
    public int getPrimerAno()
    {
        var af = from t in data.Tbl_ActivoFijos
                 orderby t.dtFecha_ingreso ascending
                 select t;
        if (af.Count() == 0)
        {
            return 0;
        }
        return af.ToList().ElementAt(0).dtFecha_ingreso.Year;

    }
    public void despreciarActivoFijo(List<Tbl_ActivoFijos> af,int User_id, String fecha)
    {
        DateTime date = Convert.ToDateTime(fecha);
        for (int i = 0; i < af.Count(); i++)
        {
            Tbl_TiposActivosFijos tipo = data.Tbl_TiposActivosFijos.Single(at => at.iTipoActivo_id == af.ElementAt(i).iTipoActivo_id);
            Tbl_ActivoFijos activodepre = new Tbl_ActivoFijos();
            activodepre.iActivoFijo_id = af.ElementAt(i).iActivoFijo_id;
            activodepre.iValorActualizado = af.ElementAt(i).iValorActualizado;
            activodepre.iDepreciacionAcumulada = af.ElementAt(i).iDepreciacionAcumulada;
            activodepre.dtFecha_ingreso = af.ElementAt(i).dtFecha_ingreso;
            activodepre.dtFecha_UltimaDepreciacion = af.ElementAt(i).dtFecha_UltimaDepreciacion;
            activodepre.iValorNeto = af.ElementAt(i).iValorNeto;
            DateTime fechaVerificando = af.ElementAt(i).dtFecha_UltimaDepreciacion;
            DateTime fechainicial = af.ElementAt(i).dtFecha_ingreso;
            int j = 1;
            DateTime fechatest = fechaVerificando.AddMonths(j);
            if (fechainicial.Day == 31 && fechaVerificando.Day == 30)
            {
                fechatest = fechatest.AddDays(1);
            }
            else if (fechainicial.Day == 31 && fechaVerificando.Day == 28)
            {
                fechatest = fechatest.AddDays(3);
            }
            else if (fechainicial.Day == 31 && fechaVerificando.Day == 29)
            {
                fechatest = fechatest.AddDays(2);
            }
            else if (fechainicial.Day == 30 && fechaVerificando.Day == 28)
            {
                fechatest = fechatest.AddDays(2);
            }
            else if (fechainicial.Day == 30 && fechaVerificando.Day == 29)
            {
                fechatest = fechatest.AddDays(1);
            }

            while (fechatest <= date)
            {
                var busquedaufv = from uf in data.Tbl_UFVs
                                  where uf.dtFecha == fechatest
                                  select uf;
                var busquedaufv2 = from uf in data.Tbl_UFVs
                                   where uf.dtFecha == activodepre.dtFecha_UltimaDepreciacion
                                  select uf;

                if (busquedaufv.ToList().Count() == 0 || busquedaufv2.ToList().Count() == 0)
                {
                    break;
                }
                Tbl_UFVs ufv = data.Tbl_UFVs.Single(uf => uf.dtFecha == fechatest);
                Tbl_UFVs ufvAnt = data.Tbl_UFVs.Single(uf => uf.dtFecha == activodepre.dtFecha_UltimaDepreciacion);
                var busqueda = from hd in data.Tbl_HistorialDepreciacion
                               where hd.iActivoFijo_id == activodepre.iActivoFijo_id && hd.dtFechaDesprecActual == fechatest
                               select hd;
                   
                    if (busqueda.ToList().Count() == 0)
                    {
                        Tbl_HistorialDepreciacion aux2 = new Tbl_HistorialDepreciacion();
                        aux2.iActivoFijo_id = activodepre.iActivoFijo_id;
                        aux2.iCreadoPor = User_id;
                        aux2.iValorAnterior = activodepre.iValorActualizado;
                        aux2.iAITBValor = activodepre.iValorActualizado * ((ufv.iValor / ufvAnt.iValor) - 1);
                        aux2.iValorActualizado = aux2.iAITBValor + activodepre.iValorActualizado;
                        decimal l = Convert.ToDecimal(tipo.iCoeficiente_despr) / 100;
                        aux2.iDeprecGestion = (aux2.iValorActualizado * l) / 12;
                        aux2.iValorNeto = aux2.iValorActualizado - aux2.iDeprecGestion;
                        if (aux2.iValorNeto < 0)
                        {
                            break;
                        }
                        aux2.iDeprecAcumulada = activodepre.iDepreciacionAcumulada;
                        aux2.iAITBDesprec = aux2.iDeprecAcumulada * ((ufv.iValor / ufvAnt.iValor) - 1);
                        aux2.iDeprecAcumuladaActualizada = aux2.iDeprecAcumulada + aux2.iAITBDesprec;
                        aux2.iDesprecTotal = aux2.iDeprecAcumuladaActualizada + aux2.iDeprecGestion;
                        aux2.iConcurrencia = 1;
                        aux2.iEstado_fl = true;
                        aux2.iConsolidado_ft = false;
                        aux2.dtFechaDesprecAnterior = activodepre.dtFecha_UltimaDepreciacion;
                        aux2.dtFechaDesprecActual = fechatest;
                        data.Tbl_HistorialDepreciacion.InsertOnSubmit(aux2);
                        activodepre.iValorActualizado = aux2.iValorActualizado;
                        activodepre.iValorNeto = aux2.iValorNeto;
                        activodepre.iUltimaDepreciacion = aux2.iDeprecGestion;
                        activodepre.iDepreciacionAcumulada = aux2.iDesprecTotal;
                        activodepre.dtFecha_UltimaDepreciacion = fechatest;
                    }
                    else
                    {
                         Tbl_HistorialDepreciacion aux = data.Tbl_HistorialDepreciacion.Single(hd => hd.iActivoFijo_id== activodepre.iActivoFijo_id && hd.dtFechaDesprecActual==fechatest);
                        aux.iActivoFijo_id = activodepre.iActivoFijo_id;
                        aux.iCreadoPor = User_id;
                        aux.iValorAnterior = activodepre.iValorActualizado;
                        aux.iAITBValor = activodepre.iValorActualizado * ((ufv.iValor / ufvAnt.iValor) - 1);
                        aux.iValorActualizado = aux.iAITBValor + activodepre.iValorActualizado;
                        decimal l = Convert.ToDecimal(tipo.iCoeficiente_despr) / 100;
                        aux.iDeprecGestion = (aux.iValorActualizado * l) / 12;
                        aux.iValorNeto = aux.iValorActualizado - aux.iDeprecGestion;
                        aux.iDeprecAcumulada = activodepre.iDepreciacionAcumulada;
                        aux.iAITBDesprec = aux.iDeprecAcumulada * ((ufv.iValor / ufvAnt.iValor) - 1);
                        aux.iDeprecAcumuladaActualizada = aux.iDeprecAcumulada + aux.iAITBDesprec;
                        aux.iDesprecTotal = aux.iDeprecAcumuladaActualizada + aux.iDeprecGestion;
                        aux.iConcurrencia = 1;
                        aux.iEstado_fl = true;
                        aux.iConsolidado_ft = false;
                        aux.dtFechaDesprecAnterior = activodepre.dtFecha_UltimaDepreciacion;
                        aux.dtFechaDesprecActual = fechatest;
                        activodepre.iValorActualizado = aux.iValorActualizado;
                        activodepre.iValorNeto = aux.iValorNeto;
                        activodepre.iUltimaDepreciacion = aux.iDeprecGestion;
                        activodepre.iDepreciacionAcumulada = aux.iDesprecTotal;
                        activodepre.dtFecha_UltimaDepreciacion = fechatest;
                    }
                j++;
                fechatest = fechaVerificando.AddMonths(j);
            }
        }
        try
        {
            data.SubmitChanges();
            Console.WriteLine("inserto!!!");
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            data.SubmitChanges();
        }
    }
    public List<Tbl_HistorialDepreciacion> gethistorialDepreByid(int id)
    {
        var lista = from dp in data.Tbl_HistorialDepreciacion
                          where dp.iActivoFijo_id == id && dp.iEstado_fl==true && dp.iConsolidado_ft==false
                          select dp;
        return lista.ToList();
    }
    public List<Tbl_HistorialDepreciacion> ListhistorialDepreByid(int id)
    {
        var lista = from dp in data.Tbl_HistorialDepreciacion
                    where dp.iHistorialDepre_id == id && dp.iEstado_fl == true && dp.iConsolidado_ft == false
                    select dp;
        return lista.ToList();
    }
    public Tbl_HistorialDepreciacion obtenerHistorialbyID(int id)
    {
        var lista = from dp in data.Tbl_HistorialDepreciacion
                    where dp.iHistorialDepre_id == id && dp.iEstado_fl == true && dp.iConsolidado_ft == false
                    select dp;
        return lista.ToList().ElementAt(0);
    }
    public List<Tbl_HistorialDepreciacion> getConsolidadosByid(int id)
    {
        var lista = from dp in data.Tbl_HistorialDepreciacion
                    where dp.iActivoFijo_id == id && dp.iEstado_fl == true && dp.iConsolidado_ft == true
                    select dp;
        return lista.ToList();
    }
    public void consolidarActivo(List<List<Tbl_HistorialDepreciacion>> x, int user_id)
    {
        for (int i = 0; i < x.Count(); i++) 
        {
            Tbl_ActivoFijos consolidado = data.Tbl_ActivoFijos.Single(af => af.iActivoFijo_id == x.ElementAt(i).ElementAt(0).iActivoFijo_id);
            int k =0;
                while(k<x.ElementAt(i).Count())
                {
                    for (int j = 0; j < x.ElementAt(i).Count();j++ )
                    {
                        if (consolidado.dtFecha_UltimaDepreciacion == x.ElementAt(i).ElementAt(j).dtFechaDesprecAnterior)
                        {
                            consolidado.iValorActualizado = x.ElementAt(i).ElementAt(j).iValorActualizado;
                            consolidado.iValorNeto = x.ElementAt(i).ElementAt(j).iValorNeto;
                            consolidado.iUltimaDepreciacion = x.ElementAt(i).ElementAt(j).iDeprecGestion;
                            consolidado.iDepreciacionAcumulada = x.ElementAt(i).ElementAt(j).iDesprecTotal;
                            consolidado.dtFecha_UltimaDepreciacion = x.ElementAt(i).ElementAt(j).dtFechaDesprecActual;
                            consolidado.iModificadoPor = user_id;
                            x.ElementAt(i).ElementAt(j).iConsolidado_ft = true;
                            x.ElementAt(i).ElementAt(j).iCreadoPor = user_id;
                        }
                    }
                    k++;
                }
                try
                {
                    data.SubmitChanges();
                    Console.WriteLine("inserto!!!");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    data.SubmitChanges();
                }
        }
    }
    public List<Tbl_HistorialMovimiento> getHistorialMovByid(int id)
    {
        var lista = from dp in data.Tbl_HistorialMovimiento
                    where dp.iActivoFijo_id == id && dp.iEstado_fl == true 
                    select dp;
        return lista.ToList();
    }
    public int getMesesDeVida(Tbl_ActivoFijos x)
    {
        Tbl_TiposActivosFijos aux = data.Tbl_TiposActivosFijos.Single(hd => hd.iTipoActivo_id == x.iTipoActivo_id);
        int mesesTotal = aux.iVidaUtil * 12;
        int mesesUso = x.dtFecha_UltimaDepreciacion.Month - x.dtFecha_ingreso.Month;
        int AnoUso = x.dtFecha_UltimaDepreciacion.Year - x.dtFecha_ingreso.Year;
     
        if(mesesUso<0)
        {
            mesesUso = 12 - mesesUso;
        }
        if (AnoUso > 0 )
        {
            AnoUso = AnoUso * 12;
            if (x.dtFecha_UltimaDepreciacion.Month < x.dtFecha_ingreso.Month)
            {
                AnoUso = AnoUso - 12;
            }
        }

        mesesTotal = mesesTotal - mesesUso - AnoUso;
        if (mesesTotal <= 0)
        {
            return 0;
        }
        return mesesTotal;
    }
    public List<Tbl_HistorialDepreciacion> getHistorialDepreByRubroyFecha(int rubro, String fecha)
    {
        var subquery = from aux in data.Tbl_ActivoFijos
                       where aux.iEstado_fl == true && aux.iTipoActivo_id == rubro
                       select aux.iActivoFijo_id;
        DateTime date = Convert.ToDateTime(fecha);
        var lista = from dp in data.Tbl_HistorialDepreciacion
                    where dp.iEstado_fl == true && dp.dtFechaDesprecActual.Month == date.Month && dp.dtFechaDesprecActual.Year == date.Year && subquery.Contains(dp.iActivoFijo_id) 
                    select dp;
        return lista.ToList();
    }
    // posicion 0= depreciacion gestion posicion 1 = depreciacion acumulada actualizada posicion 2 =depreciacion total
    public List<decimal> getTotalDeprecbyRubroyFecha(int rubro, String fecha)
    {
        var subquery = from aux in data.Tbl_ActivoFijos
                       where aux.iEstado_fl == true && aux.iTipoActivo_id == rubro
                       select aux.iActivoFijo_id;
        DateTime date = Convert.ToDateTime(fecha);
        var lista = from dp in data.Tbl_HistorialDepreciacion
                    where dp.iEstado_fl == true && dp.dtFechaDesprecActual.Month == date.Month && dp.dtFechaDesprecActual.Year == date.Year && subquery.Contains(dp.iActivoFijo_id)
                    select dp;
        List<decimal> totales = new List<decimal>();
        decimal depreciaciongestion =0;
        decimal depreciaciacionAcumulada =0;
        decimal depreciacionTotal =0;
        
        for (int i = 0; i < lista.ToList().Count; i++)
        {
           depreciaciongestion = lista.ToList().ElementAt(i).iDeprecGestion + depreciaciongestion;
           depreciaciacionAcumulada = lista.ToList().ElementAt(i).iDeprecAcumuladaActualizada + depreciaciacionAcumulada;
           depreciacionTotal = lista.ToList().ElementAt(i).iDesprecTotal + depreciacionTotal;
        }
        totales.Add(depreciaciongestion);
        totales.Add(depreciaciacionAcumulada);
        totales.Add(depreciacionTotal);
        return totales;
    }
    public List<Tbl_HistorialDepreciacion> listHistorialDeprebyRubro(int idrubro)
    {
        var subquery = from aux in data.Tbl_ActivoFijos
                       where aux.iEstado_fl == true && aux.iTipoActivo_id == idrubro
                       select aux.iActivoFijo_id;
        var lista = from dp in data.Tbl_HistorialDepreciacion
                    where dp.iEstado_fl == true && subquery.Contains(dp.iActivoFijo_id) && dp.iConsolidado_ft==false
                    select dp;
        return lista.ToList();
    }
}